package com.power.test.model.date;

import lombok.var;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class DateTimeHelper {
	/**
	 * 时间类型转为指定格式字符串
	 *
	 * @param date
	 * @param formatType
	 * @return
	 */
	public static String DateTimeToString(Date date, String formatType) {
		SimpleDateFormat df = new SimpleDateFormat(formatType);
		return df.format(date);
	}

	/**
	 * 字符串转为指定格式时间类型
	 *
	 * @param date
	 * @param formatType
	 * @return
	 */
	public static Date StringToDateTime(String date, String formatType) {
		SimpleDateFormat df = new SimpleDateFormat(formatType);
		Date dateResult = null;
		try {
			dateResult = df.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return dateResult;
	}

	/**
	 * Date转LocalDate
	 *
	 * @param date
	 */
	public static LocalDate date2LocalDate(Date date) {
		if (null == date) {
			return null;
		}
		return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
	}

	/**
	 * LocalDate转Date
	 *
	 * @param localDate
	 * @return
	 */
	public static Date localDate2Date(LocalDate localDate) {
		if (null == localDate) {
			return null;
		}
		ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
		return Date.from(zonedDateTime.toInstant());
	}

	/**
	 * 字符串转LocalDate
	 *
	 * @param value      字符串
	 * @param formatType 字符串时间格式
	 * @return
	 */
	public static LocalDate strToLocalDate(String value, String formatType) {

		try {
			DateTimeFormatter fmt = DateTimeFormatter.ofPattern(formatType);
			return LocalDate.parse(value, fmt);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 字符串转LocalDate
	 *
	 * @param value      字符串
	 * @param formatType 字符串时间格式
	 * @return
	 */
	public static LocalDateTime strToLocalDateTime(String value, String formatType) {

		try {
			DateTimeFormatter fmt = DateTimeFormatter.ofPattern(formatType);
			if (!formatType.equals("yyyy-MM-dd"))
				return LocalDateTime.parse(value, fmt);
			return LocalDate.parse(value,fmt).atStartOfDay();
		} catch (Exception e) {
			return null;
		}
	}



	// region 日期格式化

	/**
	 * 日期格式化
	 * @param date 日期
	 * @param formatType 格式化类型 （yyyy,MM,dd）
	 * @return 格式化日期
	 */
	public static String format(LocalDate date, String formatType) {
		var formatter = DateTimeFormatter.ofPattern(formatType);
		return date.format(formatter);
	}

	/**
	 * 日期格式化
	 * @param date 日期
	 * @return 格式化日期（默认：yyyy-MM-dd）
	 */
	public static String format(LocalDate date) {
		var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
		return date.format(formatter);
	}

	/**
	 * 日期时间格式化
	 * @param dateTime 日期时间
	 * @param formatType 格式化类型(yyyy,MM,dd,HH,mm,ss,SSSS)
	 * @return 格式化日期
	 */
	public static String format(LocalDateTime dateTime, String formatType) {
		var formatter = DateTimeFormatter.ofPattern(formatType);
		return dateTime.format(formatter);
	}

	/**
	 * 日期时间格式化
	 * @param dateTime 日期时间
	 * @return 格式化日期(默认：yyyy-MM-dd HH:mm:ss SSSS)
	 */
	public static String format(LocalDateTime dateTime) {
		var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSSS");
		return dateTime.format(formatter);
	}

	/**
	 * 日期时间格式化
	 * @param time 日期时间
	 * @param formatType 格式化类型(HH,mm,ss)
	 * @return 格式化日期
	 */
	public static String format(LocalTime time, String formatType) {
		var formatter = DateTimeFormatter.ofPattern(formatType);
		return time.format(formatter);
	}

	/**
	 * 日期时间格式化
	 * @param time 日期时间
	 * @return 格式化日期(默认：HH:mm:ss SSSS)
	 */
	public static String format(LocalTime time) {
		var formatter = DateTimeFormatter.ofPattern("HH:mm:ss SSSS");
		return time.format(formatter);
	}

	//endregion
}
